// 相机扩展
import * as THREE from 'three'

/**
 * 计算相机在地面处的焦点（中心射线与地面的交点）
 * @param camera 要计算的相机
 */
const CAMERA_DIRECTION = new THREE.Vector3()
const CAMERA_FOCUS_GROUND = new THREE.Vector3()
function getFocusAtGround(camera: THREE.PerspectiveCamera): THREE.Vector3 | undefined {
  // 获取相机的前方方向
  camera.getWorldDirection(CAMERA_DIRECTION)

  // 相机位置
  const P0 = camera.position // (x0, y0, z0)

  // 射线的方向
  const D = CAMERA_DIRECTION // (dx, dy, dz)

  // 计算平面交点
  const y0 = P0.y // 相机的y坐标
  const dy = D.y // 射线方向的y分量

  if (dy !== 0) {
    const t = -y0 / dy // 计算t
    CAMERA_FOCUS_GROUND.set(
      P0.x + t * D.x,
      0, // y = 0。
      P0.z + t * D.z,
    )

    // console.log('与平面的交点坐标: ', CAMERA_FOCUS_GROUND)
    return CAMERA_FOCUS_GROUND
  } else {
    // console.log('射线与平面 y=0 平行，没有交点')
    return undefined
  }
}

// 导出
export { getFocusAtGround }
